package com.hl.card.common.mq;

import org.springframework.amqp.core.MessagePostProcessor;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.rabbit.support.CorrelationData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.UUID;

@Component
public class Mq4Base {
    @Autowired
    private RabbitConfigBase rabbitConfigBase;

    public void send(String queueName,String msg){
        rabbitConfigBase.rabbitTemplate.convertAndSend(queueName, msg);
    }

    public void sendBack(String queueName,String msg){
        rabbitConfigBase.rabbitTemplate.convertAndSend(queueName + RabbitConfigBase.CALL_BACK, msg);
    }

    /**
     * 发送延迟消息,默认发送到common交换机
     * @param msg
     * @param delay
     */
    public void send(String queue_name, String msg, long delay) {
        CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
        //声明消息处理器  这个对消息进行处理  可以设置一些参数   对消息进行一些定制化处理   我们这里  来设置消息的编码  以及消息的过期时间  因为在.net 以及其他版本过期时间不一致   这里的时间毫秒值 为字符串
        MessagePostProcessor messagePostProcessor = message -> {
            MessageProperties messageProperties = message.getMessageProperties();
            //设置编码
            messageProperties.setContentEncoding("utf-8");
            //设置过期时间,单位：毫秒
            messageProperties.setExpiration(delay + "");
            //messageProperties.setDelay((int) (delay));
            return message;
        };
        //发送延时消息  delay毫秒后过期 形成死信
        rabbitConfigBase.rabbitTemplate.convertAndSend(RabbitConfigBase.getExchangeName(queue_name), RabbitConfigBase.getDelayQueueKey(queue_name), msg, messagePostProcessor, correlationData);
    }
}

